package ui;
import ui.LoginJFrame;
import ui.GameJFrame;
import ui.RegisterJFrame;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener,ActionListener {
    int count =0;//记录步数
    int x=0;int y = 0;//找到空白图片位置，即为二维数组0
    //string图片路径
    String imagename = "animal";//默认是动物文件夹
    int imagenum= 3;//默认是第三个图片
    String mypath ="image/animal/animal3/";//游戏图片路径默认测试
    String mypath01 ="image/"+imagename+"/"+imagename+imagenum+"/";//游戏图片文件路径
    //动物文件个数
    //girl文件个数
    //运动文件个数



    //为每一种图片类型链接到更换图片菜单的选项


    int[][] isWin  = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};//判断是否胜利,是初始位置一样

    int[][] data = new int[4][4];//接受图片



    //功能列的条目对象(原来initJFMenuBar())
    JMenuItem changeItem01 = new JMenuItem("动物");//更换图片菜单选项
    JMenuItem changeItem02 = new JMenuItem("人物");//更换图片菜单选项
    JMenuItem changeItem03 = new JMenuItem("运动");//更换图片菜单选项
    JMenuItem reStartItem = new JMenuItem("重新开始");
    JMenuItem reLoginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭");

    JMenuItem accountItem01 = new JMenuItem("Yukon");
    JMenuItem accountItem02 = new JMenuItem("给Yukon打赏");
    //帮助列的条目对象

    JMenuItem helpItem = new JMenuItem("awds对应上下左右移动（箭头），空格查看完整图片。");
    //彩蛋
    JMenuItem eggItem = new JMenuItem("甘雨");
    JMenuItem eggItem1 = new JMenuItem("米塔");





    public GameJFrame() {
        //初始化界面
        initJFrame();
        //初始化菜单栏
        initJFMenuBar();
        //初始图片顺序 用二维数组接受
        initData();
        //初始化图片
        initImage();



        //可见
        this.setVisible(true);
    }


    //初始化数据(二维数组)
    private void initData() {
        //初始化数据
        int[] tempArr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        //打乱数据
        for (int i = 0; i < tempArr.length; i++) {
            int index = (int)(Math.random()*16);
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
        }
        //把数组赋值给二维数组
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                data[i][j] = tempArr[i*4+j];
                if (data[i][j] == 0) {
                    x = i;
                    y = j;
                }
            }
        }
    }

    //初始化game界面图片
    private void initImage() {
        //每刷新一次就把默认测试路径改变
        mypath = mypath01;//游戏图片路径默认测试
        //声明一个局部变量接受路径
        String localpath = mypath01;
        System.out.println("走了"+count+"步");
        //删除开始图片，再重新更新图片
        this.getContentPane().removeAll();
        //更换图片逻辑在 public void actionPerformed(ActionEvent e)


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                //图片文件里的每一张图片
                int num=data[i][j] ;
//                String path = mypath+num+".jpg";
                String path = localpath+num+".jpg";

                JLabel jLabel = new JLabel(new ImageIcon(path));
                //设置图片的位置和大小
                //看initJFrame按键触发
                jLabel.setBounds(105*(j)+83, 105*(i)+130, 105, 105);
                //添加图片边框
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //把容器添加到界面
                this.getContentPane().add(jLabel);

                //添加胜利图标
                if(isWin()){
                    JLabel win = new JLabel(new ImageIcon("image/win.png"));
                    win.setBounds(200, 300, 197, 73);
                    this.getContentPane().add(win);
                }

            }
        }

        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("image/background.png"));
        background.setBounds(44, 35, 500, 560);
        this.getContentPane().add(background);

        //添加记录数显示框
        JLabel countJLabel = new JLabel("步数："+count);
        countJLabel.setBounds(20, 20, 100, 20);
        this.getContentPane().add(countJLabel);

        //刷新界面
        this.getContentPane().repaint();
    }
    //初始化菜单栏
    private void initJFMenuBar() {
        //添加JMenuBar 创建菜单选项
        JMenuBar jMenuBar = new JMenuBar();
        //功能列
        JMenu functionJMenu = new JMenu("功能");
        JMenu changeJMenu = new JMenu("更换图片");
        //关于列
        JMenu aboutJMenu = new JMenu("关于");
        //帮助列
        JMenu helpJMenu = new JMenu("帮助");
        //菜单列
        JMenu eggJMenu = new JMenu("彩蛋");

        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
        //将功能列对象添加到菜单
        functionJMenu.add(changeJMenu);//更换图片菜单添加到功能菜单
        changeJMenu.add(changeItem01);//更换图片item选项添加到更换图片菜单 动物
        changeJMenu.add(changeItem02);//更换图片item选项添加到更换图片菜单 人物
        changeJMenu.add(changeItem03);//更换图片item选项添加到更换图片菜单 运动
        functionJMenu.add(reStartItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        //将帮关于对象添加到菜单
        aboutJMenu.add(accountItem01);
        aboutJMenu.add(accountItem02);
        //将帮助列对象添加到菜单
        jMenuBar.add(helpJMenu);
        helpJMenu.add(helpItem);
        //将彩蛋列对象添加到菜单
        jMenuBar.add(eggJMenu);
        eggJMenu.add(eggItem);
        eggJMenu.add(eggItem1);
        //给条目添加监听事件
        //功能
        reStartItem.addActionListener(this) ;
        reLoginItem.addActionListener(this) ;
        closeItem.addActionListener(this) ;
        //关于
        accountItem01.addActionListener(this) ;
        accountItem02.addActionListener(this) ;
        //帮助
        helpItem.addActionListener(this) ;
        //彩蛋
        eggItem.addActionListener(this) ;
        eggItem1.addActionListener(this) ;
        //现在给更换图片菜单的每一个item写事件
        changeItem01.addActionListener(this);//动物
        changeItem02.addActionListener(this);//人物
        changeItem03.addActionListener(this);//运动

        //添加菜单到界面
        this.setJMenuBar(jMenuBar);







    }
    //初始化game界面
    private void initJFrame() {
        //设置界面宽高
        setSize(603, 680);
        //设置界面标题
        setTitle("Yukon's PuzzleGame V1.0");
        //页面置首
        this.setAlwaysOnTop(true);
        //居中
        this.setLocationRelativeTo(null);
        //关闭方式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认居中放置，使用绝对布局
        this.setLayout(null);
        //给整个键盘添加监听
        this.addKeyListener(this);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if( code == 32){ System.out.println("空格");
            //把界面所有图片去掉
            this.getContentPane().removeAll();
            //重新完整加载图片
            String path =mypath+"all.jpg";
            JLabel jLabel = new JLabel(new ImageIcon(path));
            jLabel.setBounds(83, 130, 420, 420);
            this.getContentPane().add(jLabel);

            //添加背景图片
            JLabel background = new JLabel(new ImageIcon("image/background.png"));
            background.setBounds(44, 35, 500, 560);
            this.getContentPane().add(background);
            //刷新界面
            this.getContentPane().repaint();
        }else return;
    }

    @Override
    public void keyReleased(KeyEvent e)  {
        //如果胜利，就不能动
        if(isWin()){
            return;
        }

        int code = e.getKeyCode();
//        System.out.println(code);
        switch (code){
            case 37:

                if(y==3){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                System.out.println("向左");
                data[x][y]= data[x][y+1];
                data[x][y+1] = 0;
                y++;
                initImage();

                break;
            case 38:

                if(x==3){
                    System.out.println("边界");
                    break;
                }
                System.out.println("向上");
                count++;//记录
                data[x][y]= data[x+1][y];
                data[x+1][y] = 0;
                x++;
                initImage();
                break;

            case 39:

                if(y==0){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                System.out.println("向右");
                data[x][y]= data[x][y-1];
                data[x][y-1] = 0;
                y--;
                initImage();

                break;
            case 40:

                if(x==0){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                data[x][y]= data[x-1][y];
                data[x-1][y] = 0;
                x--;
                initImage();
                System.out.println("向下");
                break;
            case 119:

                System.out.println("w");
                if(x==0){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                data[x][y]= data[x-1][y];
                data[x-1][y] = 0;
                x--;
                initImage();
                System.out.println("向下");
                break;
            case 97:

                System.out.println("a");

                if(y==3){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                System.out.println("向左");
                data[x][y]= data[x][y+1];
                data[x][y+1] = 0;
                y++;
                initImage();

                break;
            case 115:

                System.out.println("s");
                if(x==3){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                data[x][y]= data[x-1][y];
                data[x-1][y] = 0;
                x--;
                initImage();
                System.out.println("向下");
                break;
            case 100:

                System.out.println("d");
                if(y==0){
                    System.out.println("边界");
                    break;
                }
                count++;//记录
                System.out.println("向右");
                data[x][y]= data[x][y-1];
                data[x][y-1] = 0;
                y--;
                initImage();

                break;
            case 32:
                System.out.println("空格");
                //结束查看原图
                initImage();
                break;
            case 86:
                System.out.println("v");
                //完成拼图 即为二维数组重置 图片是有数字对应
                data = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
                initImage();
                break;
            default:break;
        }
    }

    //判断是否完成图片拼好
    public boolean isWin(){
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j <4; j++) {
                if(data[i][j]!=isWin[i][j]){
                    return false;

                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();
        if(obj==reStartItem){
            //重置游戏
            count=0;
            initData();
            initImage();

        }
        if(obj==reLoginItem){
            //重新登录
            System.out.println("重新登录");
            //关闭游戏界面，也就是该类this界面
            dispose();
            new LoginJFrame();

        }
        if(obj==closeItem){
            //退出虚拟机
            System.exit(0);
        }
        if(obj==accountItem02){
            //关于作者
            //创建出一个小界面，界面里面是一个二维码
            JDialog dialog1=new JDialog();
            JLabel jLabel = new JLabel(new ImageIcon("image/paypic.png"));
            jLabel.setBounds(0,0,447,500);
            dialog1.getContentPane().add(jLabel);
            //设置(弹窗)对话框大小
            dialog1.setSize(447,500);
            //至首页
            dialog1.setAlwaysOnTop(true);

            //设置(弹窗)对话框位置
            dialog1.setLocationRelativeTo(null);
            //弹窗不关闭无法操作游戏
            dialog1.setModal(true);
            //给弹窗加标题
            dialog1.setTitle("给作者Yukon微信支付打赏，不关闭无法游戏");
            //显示
            dialog1.setVisible(true);



        }
        if(obj==accountItem01){
            //关于作者
            //创建出一个小界面，界面里面是一个二维码
            JDialog dialog1=new JDialog();
            JLabel jLabel = new JLabel(new ImageIcon("image/YukonlittleAccount.png"));
            jLabel.setBounds(0,0,628,528);
            dialog1.getContentPane().add(jLabel);
            //设置(弹窗)对话框大小
            dialog1.setSize(628,528);
            //至首页
            dialog1.setAlwaysOnTop(true);

            //设置(弹窗)对话框位置
            dialog1.setLocationRelativeTo(null);
            //弹窗不关闭无法操作游戏
            dialog1.setModal(true);
            //给弹窗加标题
            dialog1.setTitle("作者，不关闭无法游戏");
            //显示
            dialog1.setVisible(true);
        }
        if (obj==eggItem){

            //创建出一个小界面，界面里面是一个图片
            JDialog dialog1=new JDialog();
            JLabel jLabel = new JLabel(new ImageIcon("image/ganyu.jpg"));
            jLabel.setBounds(0,0,1100,1100);
            dialog1.getContentPane().add(jLabel);
            //设置(弹窗)对话框大小
            dialog1.setSize(1100,1100);
            //至首页
            dialog1.setAlwaysOnTop(true);

            //设置(弹窗)对话框位置
            dialog1.setLocationRelativeTo(null);
            //弹窗不关闭无法操作游戏
            dialog1.setModal(true);
            //给弹窗加标题
            dialog1.setTitle("甘雨");
            //显示
            dialog1.setVisible(true);
        }
        if(obj==eggItem1){

            //创建出一个小界面，界面里面是一个图片
            JDialog dialog1=new JDialog();
            JLabel jLabel = new JLabel(new ImageIcon("image/miside.gif"));
            jLabel.setBounds(0,0,500,500);
            dialog1.getContentPane().add(jLabel);
            //设置(弹窗)对话框大小
            dialog1.setSize(500,500);
            //至首页
            dialog1.setAlwaysOnTop(true);

            //设置(弹窗)对话框位置
            dialog1.setLocationRelativeTo(null);
            //弹窗不关闭无法操作游戏
            dialog1.setModal(true);
            //给弹窗加标题
            dialog1.setTitle("米塔");
            //显示
            dialog1.setVisible(true);
        }
        if(obj==changeItem01){
            //选择动物
            imagename="animal";
            //随机选择动物文件夹的其中一个文件夹 在1到8中选个数
            imagenum= new Random().nextInt(8)+1;
            mypath01 ="image/"+imagename+"/"+imagename+imagenum+"/";//游戏图片文件路径
            count=0;
            initData();
            initImage();
        }
        if(obj==changeItem02){
            //选择人物
            imagename="girl";
            //随机选择girl文件夹的其中一个文件夹 在1到13中选个数
            imagenum= new Random().nextInt(13)+1;
            mypath01 ="image/"+imagename+"/"+imagename+imagenum+"/";//游戏图片文件路径
            count=0;
            initData();
            initImage();
        }
        if(obj==changeItem03){
            //选择运动
            imagename="sport";
            //随机选择sport文件夹的其中一个文件夹 在1到10中选个数
            imagenum= new Random().nextInt(10)+1;
            mypath01 ="image/"+imagename+"/"+imagename+imagenum+"/";//游戏图片文件路径
            //刷新游戏界面game
            count=0;
            initData();
            initImage();

        }
    }
}
